home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / ASSEMBLE / H145.ZIP / ASXXXX_3.ZIP / M01ADR.C < prev    next >
C/C++ Source or Header  |  1990-07-18  |  3KB  |  158 lines

  1. /* m01adr.c */
  2.  
  3. /*
  4.  * (C) Copyright 1989,1990
  5.  * All Rights Reserved
  6.  *
  7.  * Alan R. Baldwin
  8.  * 721 Berkeley St.
  9.  * Kent, Ohio  44240
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <setjmp.h>
  14. #include "asm.h"
  15. #include "m6801.h"
  16.  
  17. int
  18. addr(esp)
  19. register struct expr *esp;
  20. {
  21.     register c;
  22.     register struct area *espa;
  23.  
  24.     if ((c = getnb()) == '#') {
  25.         expr(esp, 0);
  26.         esp->e_mode = S_IMMED;
  27.     } else if (c == ',') {
  28.         esp->e_mode = S_INDX;
  29.         esp->e_flag = 0;
  30.         esp->e_addr = 0;
  31.         esp->e_base.e_ap = NULL;
  32.         if (admode(abdx) != S_X)
  33.             aerr();
  34.     } else if (c == '*') {
  35.         expr(esp, 0);
  36.         esp->e_mode = S_DIR;
  37.         if (esp->e_addr & ~0xFF)
  38.             err('d');
  39.         if (more()) {
  40.             comma();
  41.             esp->e_mode = S_INDX;
  42.             if (admode(abdx) != S_X)
  43.                 aerr();
  44.         }
  45.     } else {
  46.         unget(c);
  47.         if ((esp->e_mode = admode(abdx)) != 0) {
  48.             ;
  49.         } else {
  50.             expr(esp, 0);
  51.             if (more()) {
  52.                 comma();
  53.                 esp->e_mode = S_INDX;
  54.                 if (admode(abdx) != S_X)
  55.                     aerr();
  56.                 if ((!esp->e_flag)
  57.                     && (esp->e_base.e_ap==NULL)
  58.                     && (esp->e_addr & ~0xFF))
  59.                     aerr();
  60.             } else {
  61.                 if ((!esp->e_flag)
  62.                     && (esp->e_base.e_ap==NULL)
  63.                     && !(esp->e_addr & ~0xFF)) {
  64.                     esp->e_mode = S_DIR;
  65.                 } else {
  66.                     esp->e_mode = S_EXT;
  67.                 }
  68.             }
  69.         }
  70.     }
  71.     return (esp->e_mode);
  72. }
  73.     
  74. /*
  75.  * Enter admode() to search a specific addressing mode table
  76.  * for a match. Return the addressing value on a match or
  77.  * zero for no match.
  78.  */
  79. int
  80. admode(sp)
  81. register struct adsym *sp;
  82. {
  83.     register char *ptr;
  84.     register int i;
  85.     unget(getnb());
  86.     i = 0;
  87.     while ( *(ptr = (char *) &sp[i]) ) {
  88.         if (srch(ptr)) {
  89.             return(sp[i].a_val);
  90.         }
  91.         i++;
  92.     }
  93.     return(0);
  94. }
  95.  
  96. /*
  97.  *      srch --- does string match ?
  98.  */
  99. int
  100. srch(str)
  101. register char *str;
  102. {
  103.     register char *ptr;
  104.     ptr = ip;
  105.  
  106. #if    CASE_SENSITIVE
  107.     while (*ptr && *str) {
  108.         if(*ptr != *str)
  109.             break;
  110.         ptr++;
  111.         str++;
  112.     }
  113.     if (*ptr == *str) {
  114.         ip = ptr;
  115.         return(1);
  116.     }
  117. #else
  118.     while (*ptr && *str) {
  119.         if(ccase[*ptr] != ccase[*str])
  120.             break;
  121.         ptr++;
  122.         str++;
  123.     }
  124.     if (ccase[*ptr] == ccase[*str]) {
  125.         ip = ptr;
  126.         return(1);
  127.     }
  128. #endif
  129.  
  130.     if (!*str)
  131.         if (any(*ptr," \t\n,];")) {
  132.             ip = ptr;
  133.             return(1);
  134.         }
  135.     return(0);
  136. }
  137.  
  138. /*
  139.  *      any --- does str contain c?
  140.  */
  141. int
  142. any(c,str)
  143. char    c, *str;
  144. {
  145.     while (*str)
  146.         if(*str++ == c)
  147.             return(1);
  148.     return(0);
  149. }
  150.  
  151. struct adsym    abdx[] = {    /* a, b, d, or x registers */
  152.     "a",    S_A,
  153.     "b",    S_B,
  154.     "d",    S_D,
  155.     "x",    S_X,
  156.     "",    0x00
  157. };
  158.